home *** CD-ROM | disk | FTP | other *** search
/ The Fatted Calf / The Fatted Calf.iso / Applications / Audio / GISO / Source / TokenString.m < prev    next >
Text File  |  1994-01-26  |  2KB  |  108 lines

  1. /*
  2. ** TokenString.m,v 1.2 1992/11/08 13:45:29 nwc Exp
  3. **
  4. ** Copyright (c) 1991 Ronin Consulting, Inc.
  5. */
  6.  
  7. #import "TokenString.h"
  8. #import <string.h>
  9.  
  10. @implementation TokenString
  11.  
  12. - init
  13. {
  14.    [self init: ""];
  15.    return self;
  16. }
  17.  
  18. - init: (const char *) string
  19. {
  20.    [super init: string];
  21.    separator = ' ';
  22.    lastEnd = (char)0;
  23.    nullTokens = NO;
  24.    return self;
  25. }
  26.  
  27. - setStringValue: (const char *) string
  28. {
  29.    [super setStringValue: string];
  30.    start = (char *)[self elementAt: 0];
  31.    return self;
  32. }
  33.  
  34. - setSeparator: (char) aChar
  35. {
  36.    separator = aChar;
  37.    return self;
  38. }
  39.  
  40. - (char) separator
  41. {
  42.    return separator;
  43. }
  44.  
  45. - setNullTokens: (BOOL) toggle
  46. {
  47.    nullTokens = toggle;
  48.    return self;
  49. }
  50.  
  51. - (BOOL) nullTokens
  52. {
  53.    return nullTokens;
  54. }
  55.  
  56.  
  57. - (const char *) popToken
  58. {
  59.    char *ptr = start;
  60.  
  61.    while(*start && *start != separator)         /* advance to null or separator*/
  62.        start++;
  63.  
  64.    if(start == ptr)                 /* start did not advance - at the end of a 0 length token */
  65.    {
  66.       if(*start)                 /* zero length due to a separator */
  67.       {
  68.      if(!nullTokens)             /* if nullTokens don't fly here skip consecutive separators */
  69.      {
  70.         while(*start == separator)
  71.         start++;
  72.      
  73.         return([self popToken]);             /* passed the separators try again */
  74.      }
  75.       }
  76.       else                     /* zero length due to a null */
  77.       {
  78.      if(!(nullTokens && lastEnd))         /* we don't take null tokens or last time though we hit a null */
  79.          return (const char *)0;
  80.  
  81.      lastEnd = *start;
  82.      return "";                 /* return a null token */
  83.       }
  84.    }
  85.    
  86.    
  87.    /* 
  88.     * Token had length.
  89.     */
  90.  
  91.    lastEnd = *start;
  92.  
  93.    if(*start)                     /* separator */
  94.    {
  95.       *start = (char)0;
  96.  
  97.       if(!nullTokens)                 /* if no null tokens get rid of the multiple separators */
  98.       while(start[1] == separator)
  99.           start++;
  100.  
  101.       start++;                     /* step past separator */
  102.    }
  103.    
  104.    return (const char *)ptr;
  105. }      
  106.  
  107. @end
  108.